//  1.使用对象字面量创建对象
const o1 = {
    name:'邹希晨',
    age:20
}
console.log(o1)  // { name: '邹希晨', age: 20 }

// 2.通过 new 创建对象

//  创建后添加属性
const o2 = new Object()
// 加属性
o2.name = '青雀'
o2.age = 22
console.log(o2) // { name: '青雀', age: 22 }

// 创建前添加属性
const o3 = new Object({
    name:'三月七',
    age:22,
})
console.log(o3) // { name: '三月七', age: 22 }


// 3.通过构造函数创建对象   只有在使用 new 关键字调用它的时候，就被称之为构造函数
/** 规定
 * 1. 命名以大写字母开头
 * 2. 通过 new 关键字来调用构造函数
 */
/**特点
 * 1.调用构造函数会自动创建一个新对象
 * 2.可以给当前创建的新对象添加属性
 * 3.默认返回这个新对象，不需要写 return
 */

function Student(name,age,hobby){  // 这里面全是 实例成员
    // this => 指向 创建的新对象
    // 新对象就是实例，this 指向他 ， this.name 就是给实例添加属性
    this.name = name
    this.age = age
    this.hobby = hobby
    // 实例方法
    this.study = function () {
        console.log(this.name + '在学习')
    }
}
/** new 的 实例化执行过程
 *  1. 创建空对象
    2.构造函数 this 指向新对象
    3.执行构造函数代码
    4.返回新对象
 */


const s1 = new Student('邹希晨',22,'打游戏')
console.log(s1) // Student { name: '邹希晨', age: 22, hobby: '打游戏' }

// 使用 实例方法
s1.study() // 邹希晨在学习


const s2 = new Student('邹希晨',18,'写代码')
console.log(s2) //  Student { name: '邹希晨', age: 18, hobby: '写代码' }

//  全等 比较 地址值
console.log(s1 === s2) // false
// 实例就是 ； new 构造函数创建的对象
// 通过构造函数创建的对象称为实例对象，实例对象中的属性和方法称为实例成员
// 1.为构造函数传入参数，创建结构相同但值不同的对象
// 2.构造函数创建的实例对象彼此独立互不影响


// 静态成员 ：构造函数的属性和方法
/**
 * 1.只能通过构造函数来访问
 * 2.this 指向构造函数
 */

Student.sleep = function(){
    console.log('睡觉')
}


Student.eat = function(){
    console.log('吃饭')
}

Student.eyes = 2
// 调用 静态成员
Student.sleep() // 睡觉
console.log(Student.eyes) // 2


